package com.generic.test03.demo2;

import java.util.Arrays;

/**
 * @author bin
 * @date 2025 - 03 -27
 **/
public class MyArrayList2 <E>{
    /**
     * 数组默认容量
     * */
    private static final int DEFAULT_CAPACITY = 10;

    /**
     * 封装数组
     * */
    private Object[] elementData = {};

    /**
     * 数组实际使用的容量
     * */
    private int size = 0;

    /**
     * 缺省构造函数 实例化一个默认长度为10的数组
     * */
    public MyArrayList2(){
        this.elementData = new Object[DEFAULT_CAPACITY];
    }

    /**
     * 重载构造方法 实例化一个数组 大小由用户决定
     * @param size 数组初始容量
     * */
    public MyArrayList2(int size){
        this.elementData = new Object[size];
    }

    /**
     * 添加元素
     * @param e E类型的元素
     * @return 布尔值
     * */
    public boolean add(E e){
        grow();
        this.elementData[size++] = e;
        return true;
    }

    /**
     * 实现数组扩容
     * */
    private void grow() {
        if(size == this.elementData.length){
            this.elementData = Arrays.copyOf(this.elementData,
                    this.elementData.length * 2);
        }
    }

    /**
     * @return 获取容器的实际容量
     * */
    public int size(){
        return this.size;
    }


    /**
     * 判断数组是否为空
     * @return 布尔值
     * */
    public boolean isEmpty(){
        return this.size == 0;
    }

    /**
     * 删除指定位置的元素
     * @param index 指定位置
     * @return 删除的元素
     * */
    public E remove(int index){
        checkIndex(index);
        //获取删除的元素
        E oldValue = (E)this.elementData[index];
        System.arraycopy(this.elementData ,index + 1, this.elementData, index,this.elementData.length - index - 1);
        //最后一个元素置为null
        this.elementData[--size] = null;
        return oldValue;
    }

    public E set(int index, E element){
        checkIndex(index);
        Object oldElement = this.elementData[index];
        this.elementData[index] = element;
        return (E)oldElement;
    }

    public E get(int index){
        checkIndex(index);
        return (E)this.elementData[index];
    }



    private void checkIndex(int index) {
        if(index < 0 || index >= this.size){
            throw new IndexOutOfBoundsException("下标索引越界了" + index);
        }
    }


    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        int i = 0;
        for (Object element : this.elementData){
            sb.append(this.elementData[i]).append(",");
            i++;
        }
        if(sb.length() == 1)
            sb.append("]");
        else
             sb.setCharAt(sb.length() -1,']');
        return sb.toString();
    }
}
